package algorithmlearn;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

/**
 * @Auther: eii
 * @Date: 2020/7/9 14:30
 * @Description: 学习LinkedHashMap 源码，理解lru算法
 */
public class LRUCache<K, V>  extends LinkedHashMap<K, V> {
    private final int CACHE_SIZE;

    public LRUCache(int cacheSize) {
        // 这块就是设置一个hashmap的初始大小，同时最后一个true指的是让linkedhashmap按照访问顺序来进行排序，最近访问的放在头，最老访问的就在尾
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
        CACHE_SIZE = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
        // 这个意思就是说当map中的数据量大于指定的缓存个数的时候，就自动删除最老的数据
        return size() > CACHE_SIZE;
    }


    public static void main(String[] args) {
        LRUCache<String,String> lruCache = new LRUCache<>(5);
        lruCache.put("a1","a1");
        lruCache.put("a2","a2");
        lruCache.put("a3","a3");
        lruCache.put("a4","a4");
        lruCache.put("a5","a5");

        lruCache.get("a1");
        lruCache.forEach((k,v)->{
            System.out.println(v + "" + v);
        });
        lruCache.put("a6","a6");
        Set<String> set = lruCache.keySet();
        for (String s : set) {
            System.out.println(s);
        }
    }
}
